package com.tom.architect02.zframework.viewpager.lazy;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public abstract class LazyFragment extends LogFragment {

    private View viewRoot;

    private boolean isShow; // 避免跨页面切换时，调用2次。
    private boolean isLoaded;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        viewRoot = inflater.inflate(getLayoutId(), container, false);
        initView(viewRoot);
        if (!isShow && getUserVisibleHint()) { // 不可见到可见，才分发。
            dispatchVisibleHint(true); // 2.补充分发事件
        }
        return viewRoot;
    }

    protected abstract int getLayoutId();

    protected abstract void initView(View viewRoot);

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (viewRoot != null) { // 1.避免root为空。
            if (!isShow && isVisibleToUser) { // 避免调用2次。
                //当前从不可见变为可见
                dispatchVisibleHint(true);
            } else if (isShow && !isVisibleToUser) {
                //当前从可见变为不可见
                dispatchVisibleHint(false);
            }
        }
    }

	// 实现懒加载。
    private void dispatchVisibleHint(boolean isVisible) {
        isShow = isVisible;
        if (isVisible) {
            if (!isLoaded) { // 没加载过。才加载。
                Log.e(TAG, "开始加载" + getClass().getName());
                isLoaded = true; // 保证仅加载一次
                loadData();
            }
        } else {
            Log.e(TAG, "停止加载" + getClass().getName());
            stopLoadData();
        }
    }

    protected void stopLoadData() {
    }

    protected void loadData() {
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        viewRoot = null;
        isShow = false;
        isLoaded = false;
    }
}
